package com.unknowpupil.design.sigleton;

/**
 * @Description: 单例模式 <br/>
 * <p>
 *   单例 静态内部类式
 *   外部没有static属性，则不会向懒汉式一样立即加载对象。
 *   只要真正调用getInstance()才会加载今天内部类。加载类时式线程安全的。instance 式今天static final 类型，保证内存只有一个这个的实例。而且只赋值一次。保证线程安全
 *   兼备了并发高调用和延迟加载优势。
 *
 *   很多 公司在用。
 * </p>
 * @Author: <a> w10g </a>
 * @CreateDate: Create in 2020/4/24 16:51
 * @Classname: StaticInnerClassSingleton
 * @Version: 1.0
 */
public class StaticInnerClassSingleton {


    /**
     * 静态内部类
     * 类加载的时候实例化 天然线程安全。
     */
    private static class StaticInnerClassSingletonInstance{
        private static final StaticInnerClassSingleton instance = new StaticInnerClassSingleton();
    }

    /**
     * 1 私有构造，不让别人访问
     */
    public StaticInnerClassSingleton() {
    }

    /**
     * 用到的时候才实例化静态内部类。
     * 实现懒加载。
     * @return
     */
    public static StaticInnerClassSingleton getInstance(){

        return StaticInnerClassSingletonInstance.instance;
    }
    /**
     *    反序列化的时，直接调用方法返回对象。 这样就防止反序列化漏洞。
     */
    private Object readResolve() {
        return StaticInnerClassSingletonInstance.instance;
    }
}
